package com.wangshuqi.boot.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.serializer.RedisSerializer;
import org.springframework.session.data.redis.config.annotation.web.http.EnableRedisHttpSession;

/**
 * Spring Session 配置类
 * 使用 @EnableRedisHttpSession 注解启用 Redis Http Session
 * maxInactiveIntervalInSeconds: 设置 Session 过期时间，单位秒（默认1800秒，即30分钟）
 */
@Configuration
@EnableRedisHttpSession(maxInactiveIntervalInSeconds = 1800)
public class SessionConfig {

    /**
     * 方式一：使用默认的springboot 默认集成的 jackjson序列化
     * 自定义 Session 序列化器。
     * 使用 GenericJackson2JsonRedisSerializer 替换默认的 JDK 序列化器。
     *
     * @return 配置好的 RedisSerializer 对象
     */
    /*@Bean
    public RedisSerializer<Object> springSessionDefaultRedisSerializer() {
        // 1. 创建 ObjectMapper 并配置
        ObjectMapper objectMapper = new ObjectMapper();
        // 启用默认类型信息，这对于反序列化时识别对象类型至关重要
        // LaissezFaireSubTypeValidator.instance 表示不限制子类型，允许反序列化任何类（生产环境可考虑更严格的策略）
        objectMapper.activateDefaultTyping(
                LaissezFaireSubTypeValidator.instance,
                ObjectMapper.DefaultTyping.NON_FINAL,
                JsonTypeInfo.As.PROPERTY // 类型信息作为 JSON 的一个属性存储
        );

        // 2. 创建并使用配置好的 GenericJackson2JsonRedisSerializer
        return new GenericJackson2JsonRedisSerializer(objectMapper);
    }*/


    /**
     * 方式二：使用自定义的序列化器：fastjson序列化器
     * 自定义Session序列化器。
     * 使用我们实现的 FastJsonRedisSerializer 来序列化Session中的属性。
     * 这里我们指定序列化的是一个 Object 类型（因为Session属性可以是任何对象）
     *
     * @return 自定义的Fastjson序列化器
     */
    @Bean
    public RedisSerializer<Object> springSessionDefaultRedisSerializer() {
        // 使用我们自定义的序列化器，并传入 Object.class
        return new FastJsonRedisSerializer<>(Object.class);
    }
}